#!/usr/bin/env ruby
# encoding: utf-8

# технический метод. возвращает, заполнена ли 1цами (битовая) карта.
def bitmapFull?(bitmap) 
    sum = 0
    bitmap.each { |e| sum += e }
    return sum == bitmap.length
end

# искать в словаре для одного каркаса, вывод в stdout
def findWords(karkas, print = false)
    inschar = "ёуеыаоэяиюйьъ"
    file = File.new("../dict/efr_parsed", "r")

    counter = 1

    while (line = file.gets) 
        line.chomp!
        bitmap = Array.new(karkas.length, 0)
        insnorm = true
        line.each_char do |ch| 
            krindex = karkas.index(ch)
            if not krindex.nil?
                if bitmap[krindex] == 0
                    bitmap[krindex] = 1 
                else
                    insnorm = false
                end
            elsif inschar.index(ch).nil?
                insnorm = false 
            end
        end

        if bitmapFull?(bitmap) and insnorm 
            puts counter.to_s + ") " + line if print
            counter += 1
        end
    end
    file.close

    return counter
end

# перебор каркасов с выводом в stdout
def genKar
    sogl = "цкнгшщзхфвпрлджчсмтб"
    # рекурсию для общего случая было писать лень
    for i in 0..sogl.length - 1
        for j in i..sogl.length - 1
            for k in j..sogl.length - 1
                kar = sogl[i] + sogl[j] + sogl[k]
                puts kar + ":" + findWords(kar).to_s
            end
        end
    end
end

# сортировка перебранных каркасов из karfreq_raw; вывод в stdout
def writeFreq
    kfile = File.new("karfreq_raw", "r")
    hashmap = Hash.new
    while (kpair = kfile.gets)
        kpair.chomp
        ps = kpair.split(":")
        ps[0] = ps[0].chars.sort.join
        hashmap[ps[0]] = ps[1]
    end
    hashmap = hashmap.sort_by { |kar, cnt| cnt.to_i }
    hashmap.each {|k,v| puts k.to_s + " -> " + v.to_s }
end

# что делать
writeFreq
